import OpenAI from "openai";
import { parseMarkdownJSON } from "./parseJson";
import { IUserTask } from "./usertask";
import { getEnvs, getOSRelease } from "./env";
import { colorize } from "./colortext";

const API_KEY = process.env["AISHELL_API_KEY"];
const API_BASE = process.env["AISHELL_API_BASEURL"] || "https://api.openai.com/v1";
const API_MODEL = process.env["AISHELL_API_MODEL"] || "gpt-3.5-turbo";

if (!API_KEY) {
    console.log(colorize("No API Key found. Please set 'AISHELL_API_KEY' in the user environment variables.", "red", null, "bright"));
    process.exit(1);
}

if (!API_BASE) {
    console.log(colorize("No API Base Url configuration found. Please set 'AISHELL_API_BASEURL' in the user environment variables.", "red", null, "bright"));
    process.exit(1);
}

const openai = new OpenAI({
    apiKey: API_KEY,
    baseURL: API_BASE
});

const prompt = `你是一个Linux专家，用户会有一些任务，你需要帮助用户完成这些任务。你可以通过脚本或者命令行完成用户给你分配的任务。如果用户给的任务涉及危险操作（如删除文件、修改系统配置等），你需要明确提示用户，并在用户确认后才能执行。

## 你擅长的领域
- Linux系统操作管理
- Shell脚本编程
- 容器配置管理，如Docker、Kubernetes
- 网络配置管理
- 系统安全配置
- 系统监控管理

## 当前系统环境变量
${getEnvs()}

### 当前系统信息
${getOSRelease()}

## 用户任务
{userTask}

## 任务输出
你需要完成用户提出的任务，并用JSON格式输出结果，JSON结构如下：
{
    "type": "cmd",  // 输出的类型，可以是 "cmd"（命令行）或 "script"（脚本）
    "content": "xxxxx", // 命令行或脚本的具体内容
    "isDanger": true,  // 是否是危险操作，true 或 false
    "description": "xxxxx", // 对用户操作的详细说明
    "confirmationRequired": true  // 是否需要用户确认才能执行，true 或 false
}
`

export async function chat(taskDescription: string): Promise<IUserTask> {
    let userPrompt = prompt.replace("{userTask}", taskDescription);
    const response = await openai.chat.completions.create({
        model: API_MODEL,
        messages: [
            { role: "system", content: "You are a Linux system expert, and you are assisting users with tasks related to the Linux system." },
            { role: "user", content: userPrompt }
        ]
    });

    let userTask: IUserTask = {} as IUserTask;

    let respContent = response.choices[0].message.content;
    if (!respContent) {
        throw new Error("No response content found.");
    }

    let json = parseMarkdownJSON(respContent);
    if (json.length === 0) {
        throw new Error("No JSON found in response content.");
    }
    for (let obj of json) {
        Object.assign(userTask, obj);
    }

    return userTask;
}
